#include <algorithm>

#include "StringCopy.h"
#include "CharacterCategory.h"

#ifdef SCI_NAMESPACE
namespace Scintilla {
#endif

  namespace {

    const int catRanges[] = {
      25,
      1046,
      1073,
      1171,
      1201,
      1293,
      1326,
      1361,
      1394,
      1425,
      1452,
      1489,
      1544,
      1873,
      1938,
      2033,
      2080,
      2925,
      2961,
      2990,
      3028,
      3051,
      3092,
      3105,
      3949,
      3986,
      4014,
      4050,
      4089,
      5142,
      5169,
      5203,
      5333,
      5361,
      5396,
      5429,
      5444,
      5487,
      5522,
      5562,
      5589,
      5620,
      5653,
      5682,
      5706,
      5780,
      5793,
      5841,
      5908,
      5930,
      5956,
      6000,
      6026,
      6129,
      6144,
      6898,
      6912,
      7137,
      7922,
      7937,
      8192,
      8225,
      8256,
      8289,
      8320,
      8353,
      8384,
      8417,
      8448,
      8481,
      8512,
      8545,
      8576,
      8609,
      8640,
      8673,
      8704,
      8737,
      8768,
      8801,
      8832,
      8865,
      8896,
      8929,
      8960,
      8993,
      9024,
      9057,
      9088,
      9121,
      9152,
      9185,
      9216,
      9249,
      9280,
      9313,
      9344,
      9377,
      9408,
      9441,
      9472,
      9505,
      9536,
      9569,
      9600,
      9633,
      9664,
      9697,
      9728,
      9761,
      9792,
      9825,
      9856,
      9889,
      9920,
      9953,
      10016,
      10049,
      10080,
      10113,
      10144,
      10177,
      10208,
      10241,
      10272,
      10305,
      10336,
      10369,
      10400,
      10433,
      10464,
      10497,
      10560,
      10593,
      10624,
      10657,
      10688,
      10721,
      10752,
      10785,
      10816,
      10849,
      10880,
      10913,
      10944,
      10977,
      11008,
      11041,
      11072,
      11105,
      11136,
      11169,
      11200,
      11233,
      11264,
      11297,
      11328,
      11361,
      11392,
      11425,
      11456,
      11489,
      11520,
      11553,
      11584,
      11617,
      11648,
      11681,
      11712,
      11745,
      11776,
      11809,
      11840,
      11873,
      11904,
      11937,
      11968,
      12001,
      12032,
      12097,
      12128,
      12161,
      12192,
      12225,
      12320,
      12385,
      12416,
      12449,
      12480,
      12545,
      12576,
      12673,
      12736,
      12865,
      12896,
      12961,
      12992,
      13089,
      13184,
      13249,
      13280,
      13345,
      13376,
      13409,
      13440,
      13473,
      13504,
      13569,
      13600,
      13633,
      13696,
      13729,
      13760,
      13825,
      13856,
      13953,
      13984,
      14017,
      14048,
      14113,
      14180,
      14208,
      14241,
      14340,
      14464,
      14498,
      14529,
      14560,
      14594,
      14625,
      14656,
      14690,
      14721,
      14752,
      14785,
      14816,
      14849,
      14880,
      14913,
      14944,
      14977,
      15008,
      15041,
      15072,
      15105,
      15136,
      15169,
      15200,
      15233,
      15296,
      15329,
      15360,
      15393,
      15424,
      15457,
      15488,
      15521,
      15552,
      15585,
      15616,
      15649,
      15680,
      15713,
      15744,
      15777,
      15808,
      15841,
      15904,
      15938,
      15969,
      16000,
      16033,
      16064,
      16161,
      16192,
      16225,
      16256,
      16289,
      16320,
      16353,
      16384,
      16417,
      16448,
      16481,
      16512,
      16545,
      16576,
      16609,
      16640,
      16673,
      16704,
      16737,
      16768,
      16801,
      16832,
      16865,
      16896,
      16929,
      16960,
      16993,
      17024,
      17057,
      17088,
      17121,
      17152,
      17185,
      17216,
      17249,
      17280,
      17313,
      17344,
      17377,
      17408,
      17441,
      17472,
      17505,
      17536,
      17569,
      17600,
      17633,
      17664,
      17697,
      17728,
      17761,
      17792,
      17825,
      17856,
      17889,
      17920,
      17953,
      17984,
      18017,
      18240,
      18305,
      18336,
      18401,
      18464,
      18497,
      18528,
      18657,
      18688,
      18721,
      18752,
      18785,
      18816,
      18849,
      18880,
      18913,
      21124,
      21153,
      22019,
      22612,
      22723,
      23124,
      23555,
      23732,
      23939,
      23988,
      24003,
      24052,
      24581,
      28160,
      28193,
      28224,
      28257,
      28291,
      28340,
      28352,
      28385,
      28445,
      28483,
      28513,
      28625,
      28669,
      28820,
      28864,
      28913,
      28928,
      29053,
      29056,
      29117,
      29120,
      29185,
      29216,
      29789,
      29792,
      30081,
      31200,
      31233,
      31296,
      31393,
      31488,
      31521,
      31552,
      31585,
      31616,
      31649,
      31680,
      31713,
      31744,
      31777,
      31808,
      31841,
      31872,
      31905,
      31936,
      31969,
      32000,
      32033,
      32064,
      32097,
      32128,
      32161,
      32192,
      32225,
      32384,
      32417,
      32466,
      32480,
      32513,
      32544,
      32609,
      32672,
      34305,
      35840,
      35873,
      35904,
      35937,
      35968,
      36001,
      36032,
      36065,
      36096,
      36129,
      36160,
      36193,
      36224,
      36257,
      36288,
      36321,
      36352,
      36385,
      36416,
      36449,
      36480,
      36513,
      36544,
      36577,
      36608,
      36641,
      36672,
      36705,
      36736,
      36769,
      36800,
      36833,
      36864,
      36897,
      36949,
      36965,
      37127,
      37184,
      37217,
      37248,
      37281,
      37312,
      37345,
      37376,
      37409,
      37440,
      37473,
      37504,
      37537,
      37568,
      37601,
      37632,
      37665,
      37696,
      37729,
      37760,
      37793,
      37824,
      37857,
      37888,
      37921,
      37952,
      37985,
      38016,
      38049,
      38080,
      38113,
      38144,
      38177,
      38208,
      38241,
      38272,
      38305,
      38336,
      38369,
      38400,
      38433,
      38464,
      38497,
      38528,
      38561,
      38592,
      38625,
      38656,
      38689,
      38720,
      38753,
      38784,
      38817,
      38848,
      38881,
      38912,
      38977,
      39008,
      39041,
      39072,
      39105,
      39136,
      39169,
      39200,
      39233,
      39264,
      39297,
      39328,
      39361,
      39424,
      39457,
      39488,
      39521,
      39552,
      39585,
      39616,
      39649,
      39680,
      39713,
      39744,
      39777,
      39808,
      39841,
      39872,
      39905,
      39936,
      39969,
      40000,
      40033,
      40064,
      40097,
      40128,
      40161,
      40192,
      40225,
      40256,
      40289,
      40320,
      40353,
      40384,
      40417,
      40448,
      40481,
      40512,
      40545,
      40576,
      40609,
      40640,
      40673,
      40704,
      40737,
      40768,
      40801,
      40832,
      40865,
      40896,
      40929,
      40960,
      40993,
      41024,
      41057,
      41088,
      41121,
      41152,
      41185,
      41216,
      41249,
      41280,
      41313,
      41344,
      41377,
      41408,
      41441,
      41472,
      41505,
      41536,
      41569,
      41600,
      41633,
      41664,
      41697,
      41728,
      41761,
      41792,
      41825,
      41856,
      41889,
      41920,
      41953,
      41984,
      42017,
      42048,
      42081,
      42112,
      42145,
      42176,
      42209,
      42269,
      42528,
      43773,
      43811,
      43857,
      44061,
      44065,
      45341,
      45361,
      45388,
      45437,
      45555,
      45597,
      45605,
      47052,
      47077,
      47121,
      47141,
      47217,
      47237,
      47313,
      47333,
      47389,
      47620,
      48509,
      48644,
      48753,
      48829,
      49178,
      49341,
      49362,
      49457,
      49523,
      49553,
      49621,
      49669,
      50033,
      50077,
      50129,
      50180,
      51203,
      51236,
      51557,
      52232,
      52561,
      52676,
      52741,
      52772,
      55953,
      55972,
      56005,
      56250,
      56277,
      56293,
      56483,
      56549,
      56629,
      56645,
      56772,
      56840,
      57156,
      57269,
      57316,
      57361,
      57821,
      57850,
      57860,
      57893,
      57924,
      58885,
      59773,
      59812,
      62661,
      63012,
      63069,
      63496,
      63812,
      64869,
      65155,
      65237,
      65265,
      65347,
      65405,
      65540,
      66245,
      66371,
      66405,
      66691,
      66725,
      66819,
      66853,
      67037,
      67089,
      67581,
      67588,
      68389,
      68509,
      68561,
      68605,
      70660,
      70717,
      70724,
      71101,
      72837,
      73725,
      73733,
      73830,
      73860,
      75589,
      75622,
      75653,
      75684,
      75718,
      75813,
      76070,
      76197,
      76230,
      76292,
      76325,
      76548,
      76869,
      76945,
      77000,
      77329,
      77347,
      77380,
      77597,
      77604,
      77853,
      77861,
      77894,
      77981,
      77988,
      78269,
      78308,
      78397,
      78436,
      79165,
      79172,
      79421,
      79428,
      79485,
      79556,
      79709,
      79749,
      79780,
      79814,
      79909,
      80061,
      80102,
      80189,
      80230,
      80293,
      80324,
      80381,
      80614,
      80669,
      80772,
      80861,
      80868,
      80965,
      81053,
      81096,
      81412,
      81491,
      81546,
      81749,
      81779,
      81821,
      81957,
      82022,
      82077,
      82084,
      82301,
      82404,
      82493,
      82532,
      83261,
      83268,
      83517,
      83524,
      83613,
      83620,
      83709,
      83716,
      83805,
      83845,
      83901,
      83910,
      84005,
      84093,
      84197,
      84285,
      84325,
      84445,
      84517,
      84573,
      84772,
      84925,
      84932,
      84989,
      85192,
      85509,
      85572,
      85669,
      85725,
      86053,
      86118,
      86173,
      86180,
      86493,
      86500,
      86621,
      86628,
      87357,
      87364,
      87613,
      87620,
      87709,
      87716,
      87901,
      87941,
      87972,
      88006,
      88101,
      88285,
      88293,
      88358,
      88413,
      88422,
      88485,
      88541,
      88580,
      88637,
      89092,
      89157,
      89245,
      89288,
      89617,
      89651,
      89693,
      90149,
      90182,
      90269,
      90276,
      90557,
      90596,
      90685,
      90724,
      91453,
      91460,
      91709,
      91716,
      91805,
      91812,
      91997,
      92037,
      92068,
      92102,
      92133,
      92166,
      92197,
      92349,
      92390,
      92477,
      92518,
      92581,
      92637,
      92869,
      92902,
      92957,
      93060,
      93149,
      93156,
      93253,
      93341,
      93384,
      93717,
      93732,
      93770,
      93981,
      94277,
      94308,
      94365,
      94372,
      94589,
      94660,
      94781,
      94788,
      94941,
      95012,
      95101,
      95108,
      95165,
      95172,
      95261,
      95332,
      95421,
      95492,
      95613,
      95684,
      96093,
      96198,
      96261,
      96294,
      96381,
      96454,
      96573,
      96582,
      96677,
      96733,
      96772,
      96829,
      96998,
      97053,
      97480,
      97802,
      97909,
      98099,
      98133,
      98173,
      98342,
      98461,
      98468,
      98749,
      98756,
      98877,
      98884,
      99645,
      99652,
      99997,
      100004,
      100189,
      100260,
      100293,
      100390,
      100541,
      100549,
      100669,
      100677,
      100829,
      101029,
      101117,
      101124,
      101213,
      101380,
      101445,
      101533,
      101576,
      101917,
      102154,
      102389,
      102429,
      102470,
      102557,
      102564,
      102845,
      102852,
      102973,
      102980,
      103741,
      103748,
      104093,
      104100,
      104285,
      104325,
      104356,
      104390,
      104421,
      104454,
      104637,
      104645,
      104678,
      104765,
      104774,
      104837,
      104925,
      105126,
      105213,
      105412,
      105469,
      105476,
      105541,
      105629,
      105672,
      106013,
      106020,
      106109,
      106566,
      106653,
      106660,
      106941,
      106948,
      107069,
      107076,
      108413,
      108452,
      108486,
      108581,
      108733,
      108742,
      108861,
      108870,
      108965,
      108996,
      109053,
      109286,
      109341,
      109572,
      109637,
      109725,
      109768,
      110090,
      110301,
      110389,
      110404,
      110621,
      110662,
      110749,
      110756,
      111357,
      111428,
      112221,
      112228,
      112541,
      112548,
      112605,
      112644,
      112893,
      112965,
      113021,
      113126,
      113221,
      113341,
      113349,
      113405,
      113414,
      113693,
      114246,
      114321,
      114365,
      114724,
      116261,
      116292,
      116357,
      116605,
      116723,
      116740,
      116931,
      116965,
      117233,
      117256,
      117585,
      117661,
      118820,
      118909,
      118916,
      118973,
      119012,
      119101,
      119108,
      119165,
      119204,
      119261,
      119428,
      119581,
      119588,
      119837,
      119844,
      119965,
      119972,
      120029,
      120036,
      120093,
      120132,
      120221,
      120228,
      120357,
      120388,
      120453,
      120669,
      120677,
      120740,
      120797,
      120836,
      121021,
      121027,
      121085,
      121093,
      121309,
      121352,
      121693,
      121732,
      121885,
      122884,
      122933,
      123025,
      123509,
      123537,
      123573,
      123653,
      123733,
      123912,
      124234,
      124565,
      124581,
      124629,
      124645,
      124693,
      124709,
      124749,
      124782,
      124813,
      124846,
      124870,
      124932,
      125213,
      125220,
      126397,
      126501,
      126950,
      126981,
      127153,
      127173,
      127236,
      127397,
      127773,
      127781,
      128957,
      128981,
      129221,
      129269,
      129469,
      129493,
      129553,
      129717,
      129841,
      129917,
      131076,
      132454,
      132517,
      132646,
      132677,
      132870,
      132901,
      132966,
      133029,
      133092,
      133128,
      133457,
      133636,
      133830,
      133893,
      133956,
      134085,
      134180,
      134214,
      134308,
      134374,
      134596,
      134693,
      134820,
      135237,
      135270,
      135333,
      135398,
      135589,
      135620,
      135654,
      135688,
      136006,
      136101,
      136149,
      136192,
      137437,
      137440,
      137501,
      137632,
      137693,
      137732,
      139121,
      139139,
      139172,
      149821,
      149828,
      149981,
      150020,
      150269,
      150276,
      150333,
      150340,
      150493,
      150532,
      151869,
      151876,
      152029,
      152068,
      153149,
      153156,
      153309,
      153348,
      153597,
      153604,
      153661,
      153668,
      153821,
      153860,
      154365,
      154372,
      156221,
      156228,
      156381,
      156420,
      158589,
      158629,
      158737,
      159018,
      159677,
      159748,
      160277,
      160605,
      160772,
      163517,
      163852,
      163876,
      183729,
      183780,
      184342,
      184356,
      185197,
      185230,
      185277,
      185348,
      187761,
      187849,
      187965,
      188420,
      188861,
      188868,
      188997,
      189117,
      189444,
      190021,
      190129,
      190205,
      190468,
      191045,
      191133,
      191492,
      191933,
      191940,
      192061,
      192069,
      192157,
      192516,
      194181,
      194246,
      194277,
      194502,
      194757,
      194790,
      194853,
      195217,
      195299,
      195345,
      195443,
      195460,
      195493,
      195549,
      195592,
      195933,
      196106,
      196445,
      196625,
      196812,
      196849,
      196965,
      197078,
      197117,
      197128,
      197469,
      197636,
      198755,
      198788,
      200477,
      200708,
      202021,
      202052,
      202109,
      202244,
      204509,
      204804,
      205757,
      205829,
      205926,
      206053,
      206118,
      206237,
      206342,
      206405,
      206438,
      206629,
      206749,
      206869,
      206909,
      206993,
      207048,
      207364,
      208349,
      208388,
      208573,
      208900,
      210333,
      210438,
      210980,
      211206,
      211293,
      211464,
      211786,
      211837,
      211925,
      212996,
      213733,
      213798,
      213917,
      213969,
      214020,
      215718,
      215749,
      215782,
      215813,
      216061,
      216069,
      216102,
      216133,
      216166,
      216229,
      216486,
      216677,
      217021,
      217061,
      217096,
      217437,
      217608,
      217949,
      218129,
      218339,
      218385,
      218589,
      221189,
      221318,
      221348,
      222853,
      222886,
      222917,
      223078,
      223109,
      223142,
      223301,
      223334,
      223396,
      223645,
      223752,
      224081,
      224309,
      224613,
      224917,
      225213,
      225285,
      225350,
      225380,
      226342,
      226373,
      226502,
      226565,
      226630,
      226661,
      226694,
      226756,
      226824,
      227140,
      228549,
      228582,
      228613,
      228678,
      228773,
      228806,
      228837,
      228934,
      229021,
      229265,
      229380,
      230534,
      230789,
      231046,
      231109,
      231197,
      231281,
      231432,
      231773,
      231844,
      231944,
      232260,
      233219,
      233425,
      233501,
      235537,
      235805,
      236037,
      236145,
      236165,
      236582,
      236613,
      236836,
      236965,
      236996,
      237126,
      237189,
      237220,
      237309,
      237569,
      238979,
      240993,
      241411,
      241441,
      242531,
      243717,
      244989,
      245637,
      245760,
      245793,
      245824,
      245857,
      245888,
      245921,
      245952,
      245985,
      246016,
      246049,
      246080,
      246113,
      246144,
      246177,
      246208,
      246241,
      246272,
      246305,
      246336,
      246369,
      246400,
      246433,
      246464,
      246497,
      246528,
      246561,
      246592,
      246625,
      246656,
      246689,
      246720,
      246753,
      246784,
      246817,
      246848,
      246881,
      246912,
      246945,
      246976,
      247009,
      247040,
      247073,
      247104,
      247137,
      247168,
      247201,
      247232,
      247265,
      247296,
      247329,
      247360,
      247393,
      247424,
      247457,
      247488,
      247521,
      247552,
      247585,
      247616,
      247649,
      247680,
      247713,
      247744,
      247777,
      247808,
      247841,
      247872,
      247905,
      247936,
      247969,
      248000,
      248033,
      248064,
      248097,
      248128,
      248161,
      248192,
      248225,
      248256,
      248289,
      248320,
      248353,
      248384,
      248417,
      248448,
      248481,
      248512,
      248545,
      248576,
      248609,
      248640,
      248673,
      248704,
      248737,
      248768,
      248801,
      248832,
      248865,
      248896,
      248929,
      248960,
      248993,
      249024,
      249057,
      249088,
      249121,
      249152,
      249185,
      249216,
      249249,
      249280,
      249313,
      249344,
      249377,
      249408,
      249441,
      249472,
      249505,
      249536,
      249569,
      249600,
      249633,
      249664,
      249697,
      249728,
      249761,
      249792,
      249825,
      249856,
      249889,
      249920,
      249953,
      249984,
      250017,
      250048,
      250081,
      250112,
      250145,
      250176,
      250209,
      250240,
      250273,
      250304,
      250337,
      250368,
      250401,
      250432,
      250465,
      250496,
      250529,
      250816,
      250849,
      250880,
      250913,
      250944,
      250977,
      251008,
      251041,
      251072,
      251105,
      251136,
      251169,
      251200,
      251233,
      251264,
      251297,
      251328,
      251361,
      251392,
      251425,
      251456,
      251489,
      251520,
      251553,
      251584,
      251617,
      251648,
      251681,
      251712,
      251745,
      251776,
      251809,
      251840,
      251873,
      251904,
      251937,
      251968,
      252001,
      252032,
      252065,
      252096,
      252129,
      252160,
      252193,
      252224,
      252257,
      252288,
      252321,
      252352,
      252385,
      252416,
      252449,
      252480,
      252513,
      252544,
      252577,
      252608,
      252641,
      252672,
      252705,
      252736,
      252769,
      252800,
      252833,
      252864,
      252897,
      252928,
      252961,
      252992,
      253025,
      253056,
      253089,
      253120,
      253153,
      253184,
      253217,
      253248,
      253281,
      253312,
      253345,
      253376,
      253409,
      253440,
      253473,
      253504,
      253537,
      253568,
      253601,
      253632,
      253665,
      253696,
      253729,
      253760,
      253793,
      253824,
      253857,
      253888,
      253921,
      254208,
      254465,
      254685,
      254720,
      254941,
      254977,
      255232,
      255489,
      255744,
      256001,
      256221,
      256256,
      256477,
      256513,
      256797,
      256800,
      256861,
      256864,
      256925,
      256928,
      256989,
      256992,
      257025,
      257280,
      257537,
      258013,
      258049,
      258306,
      258561,
      258818,
      259073,
      259330,
      259585,
      259773,
      259777,
      259840,
      259970,
      260020,
      260033,
      260084,
      260161,
      260285,
      260289,
      260352,
      260482,
      260532,
      260609,
      260765,
      260801,
      260864,
      261021,
      261044,
      261121,
      261376,
      261556,
      261661,
      261697,
      261821,
      261825,
      261888,
      262018,
      262068,
      262141,
      262166,
      262522,
      262668,
      262865,
      262927,
      262960,
      262989,
      263023,
      263088,
      263117,
      263151,
      263185,
      263447,
      263480,
      263514,
      263670,
      263697,
      263983,
      264016,
      264049,
      264171,
      264241,
      264338,
      264365,
      264398,
      264433,
      264786,
      264817,
      264843,
      264881,
      265206,
      265242,
      265405,
      265562,
      265738,
      265763,
      265821,
      265866,
      266066,
      266157,
      266190,
      266211,
      266250,
      266578,
      266669,
      266702,
      266749,
      266755,
      267197,
      267283,
      268125,
      268805,
      269223,
      269349,
      269383,
      269477,
      269885,
      270357,
      270400,
      270453,
      270560,
      270613,
      270657,
      270688,
      270785,
      270848,
      270945,
      270997,
      271008,
      271061,
      271122,
      271136,
      271317,
      271488,
      271541,
      271552,
      271605,
      271616,
      271669,
      271680,
      271829,
      271841,
      271872,
      272001,
      272036,
      272161,
      272213,
      272257,
      272320,
      272402,
      272544,
      272577,
      272725,
      272754,
      272789,
      272833,
      272885,
      272906,
      273417,
      274528,
      274561,
      274601,
      274730,
      274781,
      274962,
      275125,
      275282,
      275349,
      275474,
      275509,
      275570,
      275605,
      275666,
      275701,
      275922,
      275957,
      276946,
      277013,
      277074,
      277109,
      277138,
      277173,
      278162,
      286741,
      286994,
      287125,
      287762,
      287829,
      288045,
      288078,
      288117,
      290706,
      290741,
      291698,
      292501,
      293778,
      293973,
      294557,
      294933,
      296189,
      296981,
      297341,
      297994,
      299925,
      302410,
      303125,
      308978,
      309013,
      309298,
      309333,
      311058,
      311317,
      314866,
      314901,
      319517,
      319541,
      322829,
      322862,
      322893,
      322926,
      322957,
      322990,
      323021,
      323054,
      323085,
      323118,
      323149,
      323182,
      323213,
      323246,
      323274,
      324245,
      325650,
      325805,
      325838,
      325874,
      326861,
      326894,
      326925,
      326958,
      326989,
      327022,
      327053,
      327086,
      327117,
      327150,
      327186,
      327701,
      335890,
      340077,
      340110,
      340141,
      340174,
      340205,
      340238,
      340269,
      340302,
      340333,
      340366,
      340397,
      340430,
      340461,
      340494,
      340525,
      340558,
      340589,
      340622,
      340653,
      340686,
      340717,
      340750,
      340786,
      342797,
      342830,
      342861,
      342894,
      342930,
      343949,
      343982,
      344018,
      352277,
      353810,
      354485,
      354546,
      354749,
      354837,
      355165,
      360448,
      361981,
      361985,
      363517,
      363520,
      363553,
      363584,
      363681,
      363744,
      363777,
      363808,
      363841,
      363872,
      363905,
      363936,
      364065,
      364096,
      364129,
      364192,
      364225,
      364419,
      364480,
      364577,
      364608,
      364641,
      364672,
      364705,
      364736,
      364769,
      364800,
      364833,
      364864,
      364897,
      364928,
      364961,
      364992,
      365025,
      365056,
      365089,
      365120,
      365153,
      365184,
      365217,
      365248,
      365281,
      365312,
      365345,
      365376,
      365409,
      365440,
      365473,
      365504,
      365537,
      365568,
      365601,
      365632,
      365665,
      365696,
      365729,
      365760,
      365793,
      365824,
      365857,
      365888,
      365921,
      365952,
      365985,
      366016,
      366049,
      366080,
      366113,
      366144,
      366177,
      366208,
      366241,
      366272,
      366305,
      366336,
      366369,
      366400,
      366433,
      366464,
      366497,
      366528,
      366561,
      366592,
      366625,
      366656,
      366689,
      366720,
      366753,
      366784,
      366817,
      366848,
      366881,
      366912,
      366945,
      366976,
      367009,
      367040,
      367073,
      367104,
      367137,
      367168,
      367201,
      367232,
      367265,
      367296,
      367329,
      367360,
      367393,
      367424,
      367457,
      367488,
      367521,
      367552,
      367585,
      367616,
      367649,
      367680,
      367713,
      367797,
      367968,
      368001,
      368032,
      368065,
      368101,
      368192,
      368225,
      368285,
      368433,
      368554,
      368593,
      368641,
      369885,
      369889,
      369949,
      370081,
      370141,
      370180,
      371997,
      372195,
      372241,
      372285,
      372709,
      372740,
      373501,
      373764,
      374013,
      374020,
      374269,
      374276,
      374525,
      374532,
      374781,
      374788,
      375037,
      375044,
      375293,
      375300,
      375549,
      375556,
      375805,
      375813,
      376849,
      376911,
      376944,
      376975,
      377008,
      377041,
      377135,
      377168,
      377201,
      377231,
      377264,
      377297,
      377580,
      377617,
      377676,
      377713,
      377743,
      377776,
      377809,
      377871,
      377904,
      377933,
      377966,
      377997,
      378030,
      378061,
      378094,
      378125,
      378158,
      378193,
      378339,
      378385,
      378700,
      378781,
      380949,
      381789,
      381813,
      384669,
      385045,
      391901,
      392725,
      393117,
      393238,
      393265,
      393365,
      393379,
      393412,
      393449,
      393485,
      393518,
      393549,
      393582,
      393613,
      393646,
      393677,
      393710,
      393741,
      393774,
      393813,
      393869,
      393902,
      393933,
      393966,
      393997,
      394030,
      394061,
      394094,
      394124,
      394157,
      394190,
      394261,
      394281,
      394565,
      394694,
      394764,
      394787,
      394965,
      395017,
      395107,
      395140,
      395185,
      395221,
      395293,
      395300,
      398077,
      398117,
      398196,
      398243,
      398308,
      398348,
      398372,
      401265,
      401283,
      401380,
      401437,
      401572,
      402909,
      402980,
      406013,
      406037,
      406090,
      406229,
      406532,
      407421,
      407573,
      408733,
      409092,
      409621,
      410621,
      410634,
      410965,
      411914,
      412181,
      412202,
      412693,
      413706,
      414037,
      415274,
      415765,
      417789,
      417813,
      425988,
      636637,
      636949,
      638980,
      1309117,
      1310724,
      1311395,
      1311428,
      1348029,
      1348117,
      1349885,
      1350148,
      1351427,
      1351633,
      1351684,
      1360259,
      1360305,
      1360388,
      1360904,
      1361220,
      1361309,
      1361920,
      1361953,
      1361984,
      1362017,
      1362048,
      1362081,
      1362112,
      1362145,
      1362176,
      1362209,
      1362240,
      1362273,
      1362304,
      1362337,
      1362368,
      1362401,
      1362432,
      1362465,
      1362496,
      1362529,
      1362560,
      1362593,
      1362624,
      1362657,
      1362688,
      1362721,
      1362752,
      1362785,
      1362816,
      1362849,
      1362880,
      1362913,
      1362944,
      1362977,
      1363008,
      1363041,
      1363072,
      1363105,
      1363136,
      1363169,
      1363200,
      1363233,
      1363264,
      1363297,
      1363328,
      1363361,
      1363396,
      1363429,
      1363463,
      1363569,
      1363589,
      1363921,
      1363939,
      1363968,
      1364001,
      1364032,
      1364065,
      1364096,
      1364129,
      1364160,
      1364193,
      1364224,
      1364257,
      1364288,
      1364321,
      1364352,
      1364385,
      1364416,
      1364449,
      1364480,
      1364513,
      1364544,
      1364577,
      1364608,
      1364641,
      1364672,
      1364705,
      1364765,
      1364965,
      1364996,
      1367241,
      1367557,
      1367633,
      1367837,
      1368084,
      1368803,
      1369108,
      1369152,
      1369185,
      1369216,
      1369249,
      1369280,
      1369313,
      1369344,
      1369377,
      1369408,
      1369441,
      1369472,
      1369505,
      1369536,
      1369569,
      1369664,
      1369697,
      1369728,
      1369761,
      1369792,
      1369825,
      1369856,
      1369889,
      1369920,
      1369953,
      1369984,
      1370017,
      1370048,
      1370081,
      1370112,
      1370145,
      1370176,
      1370209,
      1370240,
      1370273,
      1370304,
      1370337,
      1370368,
      1370401,
      1370432,
      1370465,
      1370496,
      1370529,
      1370560,
      1370593,
      1370624,
      1370657,
      1370688,
      1370721,
      1370752,
      1370785,
      1370816,
      1370849,
      1370880,
      1370913,
      1370944,
      1370977,
      1371008,
      1371041,
      1371072,
      1371105,
      1371136,
      1371169,
      1371200,
      1371233,
      1371264,
      1371297,
      1371328,
      1371361,
      1371392,
      1371425,
      1371456,
      1371489,
      1371520,
      1371553,
      1371584,
      1371617,
      1371651,
      1371681,
      1371936,
      1371969,
      1372000,
      1372033,
      1372064,
      1372129,
      1372160,
      1372193,
      1372224,
      1372257,
      1372288,
      1372321,
      1372352,
      1372385,
      1372419,
      1372468,
      1372512,
      1372545,
      1372576,
      1372609,
      1372669,
      1372672,
      1372705,
      1372736,
      1372769,
      1372829,
      1373184,
      1373217,
      1373248,
      1373281,
      1373312,
      1373345,
      1373376,
      1373409,
      1373440,
      1373473,
      1373504,
      1373565,
      1376003,
      1376065,
      1376100,
      1376325,
      1376356,
      1376453,
      1376484,
      1376613,
      1376644,
      1377382,
      1377445,
      1377510,
      1377557,
      1377693,
      1377802,
      1378005,
      1378067,
      1378101,
      1378141,
      1378308,
      1379985,
      1380125,
      1380358,
      1380420,
      1382022,
      1382533,
      1382589,
      1382865,
      1382920,
      1383261,
      1383429,
      1384004,
      1384209,
      1384292,
      1384349,
      1384456,
      1384772,
      1385669,
      1385937,
      1385988,
      1386725,
      1387078,
      1387165,
      1387505,
      1387524,
      1388477,
      1388549,
      1388646,
      1388676,
      1390181,
      1390214,
      1390277,
      1390406,
      1390469,
      1390502,
      1390641,
      1391069,
      1391075,
      1391112,
      1391453,
      1391569,
      1391645,
      1392644,
      1393957,
      1394150,
      1394213,
      1394278,
      1394341,
      1394429,
      1394692,
      1394789,
      1394820,
      1395077,
      1395110,
      1395165,
      1395208,
      1395549,
      1395601,
      1395716,
      1396227,
      1396260,
      1396469,
      1396548,
      1396582,
      1396637,
      1396740,
      1398277,
      1398308,
      1398341,
      1398436,
      1398501,
      1398564,
      1398725,
      1398788,
      1398821,
      1398852,
      1398909,
      1399652,
      1399715,
      1399761,
      1399812,
      1400166,
      1400197,
      1400262,
      1400337,
      1400388,
      1400419,
      1400486,
      1400517,
      1400573,
      1400868,
      1401085,
      1401124,
      1401341,
      1401380,
      1401597,
      1401860,
      1402109,
      1402116,
      1402365,
      1406980,
      1408102,
      1408165,
      1408198,
      1408261,
      1408294,
      1408369,
      1408390,
      1408421,
      1408477,
      1408520,
      1408861,
      1409028,
      1766557,
      1766916,
      1767677,
      1767780,
      1769373,
      1769499,
      1835036,
      2039812,
      2051549,
      2051588,
      2055005,
      2056193,
      2056445,
      2056801,
      2056989,
      2057124,
      2057157,
      2057188,
      2057522,
      2057540,
      2057981,
      2057988,
      2058173,
      2058180,
      2058237,
      2058244,
      2058333,
      2058340,
      2058429,
      2058436,
      2061908,
      2062429,
      2062948,
      2074573,
      2074606,
      2074653,
      2075140,
      2077213,
      2077252,
      2079005,
      2080260,
      2080659,
      2080693,
      2080733,
      2080773,
      2081297,
      2081517,
      2081550,
      2081585,
      2081629,
      2081797,
      2082045,
      2082321,
      2082348,
      2082411,
      2082477,
      2082510,
      2082541,
      2082574,
      2082605,
      2082638,
      2082669,
      2082702,
      2082733,
      2082766,
      2082797,
      2082830,
      2082861,
      2082894,
      2082925,
      2082958,
      2082993,
      2083053,
      2083086,
      2083121,
      2083243,
      2083345,
      2083453,
      2083473,
      2083596,
      2083629,
      2083662,
      2083693,
      2083726,
      2083757,
      2083790,
      2083825,
      2083922,
      2083948,
      2083986,
      2084093,
      2084113,
      2084147,
      2084177,
      2084253,
      2084356,
      2084541,
      2084548,
      2088893,
      2088954,
      2088989,
      2089009,
      2089107,
      2089137,
      2089229,
      2089262,
      2089297,
      2089330,
      2089361,
      2089388,
      2089425,
      2089480,
      2089809,
      2089874,
      2089969,
      2090016,
      2090861,
      2090897,
      2090926,
      2090964,
      2090987,
      2091028,
      2091041,
      2091885,
      2091922,
      2091950,
      2091986,
      2092013,
      2092046,
      2092081,
      2092109,
      2092142,
      2092177,
      2092228,
      2092547,
      2092580,
      2094019,
      2094084,
      2095101,
      2095172,
      2095389,
      2095428,
      2095645,
      2095684,
      2095901,
      2095940,
      2096061,
      2096147,
      2096210,
      2096244,
      2096277,
      2096307,
      2096381,
      2096405,
      2096434,
      2096565,
      2096637,
      2096954,
      2097045,
      2097117,
      2097156,
      2097565,
      2097572,
      2098429,
      2098436,
      2099069,
      2099076,
      2099165,
      2099172,
      2099677,
      2099716,
      2100189,
      2101252,
      2105213,
      2105361,
      2105469,
      2105578,
      2107037,
      2107125,
      2107401,
      2109098,
      2109237,
      2109770,
      2109821,
      2109973,
      2110365,
      2112021,
      2113445,
      2113501,
      2117636,
      2118589,
      2118660,
      2120253,
      2121732,
      2122749,
      2122762,
      2122909,
      2123268,
      2123817,
      2123844,
      2124105,
      2124157,
      2125828,
      2126813,
      2126833,
      2126852,
      2128029,
      2128132,
      2128401,
      2128425,
      2128605,
      2129920,
      2131201,
      2132484,
      2135005,
      2135048,
      2135389,
      2162692,
      2162909,
      2162948,
      2163005,
      2163012,
      2164445,
      2164452,
      2164541,
      2164612,
      2164669,
      2164708,
      2165469,
      2165489,
      2165514,
      2165789,
      2170884,
      2171594,
      2171805,
      2171889,
      2171908,
      2172765,
      2172913,
      2172957,
      2174980,
      2176797,
      2176964,
      2177053,
      2179076,
      2179109,
      2179229,
      2179237,
      2179325,
      2179461,
      2179588,
      2179741,
      2179748,
      2179869,
      2179876,
      2180765,
      2180869,
      2180989,
      2181093,
      2181130,
      2181405,
      2181649,
      2181949,
      2182148,
      2183082,
      2183153,
      2183197,
      2187268,
      2189021,
      2189105,
      2189316,
      2190045,
      2190090,
      2190340,
      2190973,
      2191114,
      2191389,
      2195460,
      2197821,
      2214922,
      2215933,
      2228230,
      2228261,
      2228294,
      2228324,
      2230021,
      2230513,
      2230749,
      2230858,
      2231496,
      2231837,
      2232325,
      2232390,
      2232420,
      2233862,
      2233957,
      2234086,
      2234149,
      2234225,
      2234298,
      2234321,
      2234461,
      2234884,
      2235709,
      2235912,
      2236253,
      2236421,
      2236516,
      2237669,
      2237830,
      2237861,
      2238141,
      2238152,
      2238481,
      2238621,
      2240517,
      2240582,
      2240612,
      2242150,
      2242245,
      2242534,
      2242596,
      2242737,
      2242877,
      2243080,
      2243421,
      2281476,
      2282853,
      2282886,
      2282917,
      2282950,
      2283013,
      2283206,
      2283237,
      2283293,
      2283528,
      2283869,
      2359300,
      2387453,
      2392073,
      2395261,
      2395665,
      2395805,
      2490372,
      2524669,
      2949124,
      2967357,
      3006468,
      3008701,
      3009028,
      3009062,
      3010557,
      3011045,
      3011171,
      3011613,
      3538948,
      3539037,
      3801109,
      3808989,
      3809301,
      3810557,
      3810613,
      3812518,
      3812581,
      3812693,
      3812774,
      3812986,
      3813221,
      3813493,
      3813541,
      3813781,
      3814725,
      3814869,
      3816413,
      3817493,
      3819589,
      3819701,
      3819741,
      3825685,
      3828477,
      3828746,
      3829341,
      3833856,
      3834689,
      3835520,
      3836353,
      3836605,
      3836609,
      3837184,
      3838017,
      3838848,
      3838909,
      3838912,
      3839005,
      3839040,
      3839101,
      3839136,
      3839229,
      3839264,
      3839421,
      3839424,
      3839681,
      3839837,
      3839841,
      3839901,
      3839905,
      3840157,
      3840161,
      3840512,
      3841345,
      3842176,
      3842269,
      3842272,
      3842429,
      3842464,
      3842749,
      3842752,
      3843005,
      3843009,
      3843840,
      3843933,
      3843936,
      3844093,
      3844096,
      3844285,
      3844288,
      3844349,
      3844416,
      3844669,
      3844673,
      3845504,
      3846337,
      3847168,
      3848001,
      3848832,
      3849665,
      3850496,
      3851329,
      3852160,
      3852993,
      3853824,
      3854657,
      3855581,
      3855616,
      3856434,
      3856449,
      3857266,
      3857281,
      3857472,
      3858290,
      3858305,
      3859122,
      3859137,
      3859328,
      3860146,
      3860161,
      3860978,
      3860993,
      3861184,
      3862002,
      3862017,
      3862834,
      3862849,
      3863040,
      3863858,
      3863873,
      3864690,
      3864705,
      3864896,
      3864929,
      3864989,
      3865032,
      3866653,
      4046852,
      4047005,
      4047012,
      4047901,
      4047908,
      4047997,
      4048004,
      4048061,
      4048100,
      4048157,
      4048164,
      4048509,
      4048516,
      4048669,
      4048676,
      4048733,
      4048740,
      4048797,
      4048964,
      4049021,
      4049124,
      4049181,
      4049188,
      4049245,
      4049252,
      4049309,
      4049316,
      4049437,
      4049444,
      4049533,
      4049540,
      4049597,
      4049636,
      4049693,
      4049700,
      4049757,
      4049764,
      4049821,
      4049828,
      4049885,
      4049892,
      4049949,
      4049956,
      4050045,
      4050052,
      4050109,
      4050148,
      4050301,
      4050308,
      4050557,
      4050564,
      4050717,
      4050724,
      4050877,
      4050884,
      4050941,
      4050948,
      4051293,
      4051300,
      4051869,
      4052004,
      4052125,
      4052132,
      4052317,
      4052324,
      4052893,
      4054546,
      4054621,
      4063253,
      4064669,
      4064789,
      4067997,
      4068373,
      4068861,
      4068917,
      4069373,
      4069429,
      4069917,
      4069941,
      4070429,
      4071434,
      4071805,
      4071957,
      4072957,
      4072981,
      4074909,
      4075029,
      4076413,
      4078805,
      4079741,
      4080149,
      4081533,
      4081685,
      4081981,
      4082197,
      4082269,
      4087829,
      4088893,
      4089365,
      4089565,
      4089589,
      4091837,
      4091925,
      4092573,
      4092949,
      4094141,
      4094165,
      4094333,
      4094997,
      4095549,
      4096021,
      4098045,
      4098069,
      4098109,
      4098133,
      4103965,
      4103989,
      4104125,
      4104213,
      4106205,
      4106261,
      4106397,
      4106773,
      4107549,
      4112245,
      4114493,
      4114613,
      4114973,
      4116501,
      4118749,
      4120597,
      4124317,
      4194308,
      5561085,
      5562372,
      5695165,
      5695492,
      5702621,
      6225924,
      6243293,
      29360186,
      29360221,
      29361178,
      29364253,
      29368325,
      29376029,
      31457308,
      33554397,
      33554460,
      35651549,

    };

    const int maxUnicode = 0x10ffff;
    const int maskCategory = 0x1F;
    const int nRanges = ELEMENTS( catRanges );

  }

  CharacterCategory CategoriseCharacter( int character ) {
    if( character < 0 || character > maxUnicode ) {
      return ccCn;
    }
    const int baseValue = character * ( maskCategory + 1 ) + maskCategory;
    const int *placeAfter = std::lower_bound( catRanges, catRanges + nRanges, baseValue );
    return static_cast<CharacterCategory>( *( placeAfter - 1 ) & maskCategory );
  }

  #ifdef SCI_NAMESPACE
}
  #endif
